﻿using System;
// 假定S是B的子类，如果X<S>允许引用转换成X<B>，那么称X为协变类
namespace _077_协变_接口
{
    class Animal { }
    class Bear : Animal { }
    class Camel : Animal { }
    public class Stack<T> : IPoppable<T> //简单的栈实现
    {
        int position;
        T[] data = new T[100];
        public void Push(T obj) { data[position++] = obj; }
        public T Pop() { return data[--position]; }
    }
    // out修饰符将接口标识为具有协变性的，并允许以下操作：
    public interface IPoppable<out T> { T Pop(); }
    class Program
    {
        static void Main(string[] args)
        {
            var bears = new Stack<Bear>();
            bears.Push(new Bear());
            // Bears实现IPoppable<Bear>。我们可以把它转换成IPoppable<Animal>：
            IPoppable<Animal> animals = bears; // 合法
            Animal a = animals.Pop();
        }
    }
}